// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved

#include "Private.h"
#include "Globals.h"
#include "EditSession.h"
#include "SampleIME.h"

//////////////////////////////////////////////////////////////////////
//
//    ITfEditSession
//        CEditSessionBase
// CEndCompositionEditSession class
//
//////////////////////////////////////////////////////////////////////

//+---------------------------------------------------------------------------
//
// CEndCompositionEditSession
//
//----------------------------------------------------------------------------

class CEndCompositionEditSession : public CEditSessionBase {
public:
	CEndCompositionEditSession(_In_ CSampleIME* pTextService, _In_ ITfContext* pContext) : CEditSessionBase(pTextService, pContext) {}

	// ITfEditSession
	STDMETHODIMP DoEditSession(TfEditCookie ec) {
		_pTextService->_TerminateComposition(ec, _pContext, TRUE);
		return S_OK;
	}

};

//////////////////////////////////////////////////////////////////////
//
// CSampleIME class
//
//////////////////////////////////////////////////////////////////////

//+---------------------------------------------------------------------------
//
// _TerminateComposition
//
//----------------------------------------------------------------------------

void CSampleIME::_TerminateComposition(TfEditCookie ec, _In_ ITfContext* pContext, BOOL isCalledFromDeactivate) {
	isCalledFromDeactivate;

	if (_pComposition != nullptr) {
		// remove the display attribute from the composition range.
		_ClearCompositionDisplayAttributes(ec, pContext);

		if (FAILED(_pComposition->EndComposition(ec))) {
			// if we fail to EndComposition, then we need to close the reverse reading window.
			_DeleteCandidateList(TRUE, pContext);
		}

		_pComposition->Release();
		_pComposition = nullptr;

		if (_pContext) {
			_pContext->Release();
			_pContext = nullptr;
		}
	}
}

//+---------------------------------------------------------------------------
//
// _EndComposition
//
//----------------------------------------------------------------------------

void CSampleIME::_EndComposition(_In_opt_ ITfContext* pContext) {
	CEndCompositionEditSession* pEditSession = new (std::nothrow) CEndCompositionEditSession(this, pContext);
	HRESULT hr = S_OK;

	if (nullptr != pEditSession) {
		pContext->RequestEditSession(_tfClientId, pEditSession, TF_ES_ASYNCDONTCARE | TF_ES_READWRITE, &hr);
		pEditSession->Release();
	}
}

